package cn.supermaster.management.schedule.quartz;

import org.quartz.CronExpression;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.ParseException;
import java.util.Date;

/**
 * All rights Reserved, Designed By www.super-bytecode.com
 *
 * @ProjectName: supermaster-management
 * @Package: cn.supermaster.management.task.util
 * @ClassName: CronUtils1
 * @Description: [cron表达式工具类]
 * <p> </p>
 * @Author: [Lance Ting]
 * @Date: 2021/1/13 9:36
 * @Version: V1.0
 * @Copyright: 2021 www.super-bytecode.com Inc. All rights reserved.
 * TODO: 注意,本文件Lance Ting所作,如果转载或使用请标明具体出处!
 **/
public class CronUtils {

    private final static Logger logger = LoggerFactory.getLogger(CronUtils.class);

    /**
     * @description: [校验cron表达式的有效性]
     * <p>返回一个布尔值代表一个给定的Cron表达式的有效性</P>
     * @title: isValid
     * @author: Lance Ting
     * @date: 2021-01-13
     * @param: cron Cron表达式
     * @return: boolean 表达式是否有效
     */
    public static boolean isValid(String cron) {
        boolean validExpression = CronExpression.isValidExpression(cron);
        return validExpression;
    }

    /**
     * @description: [解析Cron表达式]
     * <p>返回一个字符串值,表示该消息无效Cron表达式给出有效性</P>
     * @title: getInvalidMessage
     * @author: Lance Ting
     * @date: 2021-01-13
     * @param: cron Cron表达式
     * @return: java.lang.String 无效时返回表达式错误描述,如果有效返回null
     */
    public static String getInvalidMessage(String cron) {
        String message = null;
        try {
            // 设置cron表达式对象
            CronExpression expression = new CronExpression(cron);
        } catch (ParseException e) {
            message = e.getMessage();
            logger.error("Cron表达式解析失败，" + message);
        }
        return message;
    }

    /**
     * @description: [获取定时任务下一次执行时间]
     * <p>返回下一个执行时间根据给定的Cron表达式</P>
     * @title: getNextExecution
     * @author: Lance Ting
     * @date: 2021-01-13
     * @param: cron Cron表达式
     * @return: java.util.Date 下次Cron表达式执行时间
     */
    public static Date getNextExecution(String cron) {
        Date nextValidTimeAfter = null;
        try {
            CronExpression expression = new CronExpression(cron);
            Date current = new Date(System.currentTimeMillis());
            nextValidTimeAfter = expression.getNextValidTimeAfter(current);
        } catch (ParseException e) {
            logger.error("获取{}定时任务下一次执行时间失败，{}", cron, e.getMessage());
            throw new IllegalArgumentException(e.getMessage());
        }
        return nextValidTimeAfter;
    }
}
